package com.wudl.queue.config;


import com.wudl.queue.domain.User;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

/**
 * @author ：wudl
 * @date ：Created in 2021-12-12 22:08
 * @description：
 * @modified By：
 * @version: 1.0
 */

public class ApplicationQueue {
    //队列大小
    static final int QUEUE_MAX_SIZE = 1000;

    static BlockingQueue<User> blockingQueue = new LinkedBlockingQueue<User>(Integer.MAX_VALUE);

    /**
     * 私有的默认构造子，保证外界无法直接实例化
     */
    private ApplicationQueue() {
    }

    ;

    /**
     * 类级的内部类，也就是静态的成员式内部类，该内部类的实例与外部类的实例
     * 没有绑定关系，而且只有被调用到才会装载，从而实现了延迟加载
     */
    private static class SingletonHolder {
        /**
         * 静态初始化器，由JVM来保证线程安全
         */
        private static ApplicationQueue queue = new ApplicationQueue();
    }

    //单例队列
    public static ApplicationQueue getMailQueue() {
        return SingletonHolder.queue;
    }

    //生产入队
    public void produce(User mail) throws InterruptedException {
        blockingQueue.put(mail);
    }

    //消费出队
    public User consume() throws InterruptedException {
        return blockingQueue.take();
    }

    // 获取队列大小
    public int size() {
        return blockingQueue.size();
    }
}
